`timescale 1ns / 1ps
//////////////////////////////////////////////////////////////////////////////////
// Company: 
// Engineer: 
// 
// Create Date: 11/03/2021 05:43:36 PM
// Design Name: 
// Module Name: eliminator
// Project Name: 
// Target Devices: 
// Tool Versions: 
// Description: 
// 
// Dependencies: 
// 
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
// 
//////////////////////////////////////////////////////////////////////////////////


module eliminator(
    input rst_n,
    input clk,
    input key,
    output reg  key_value,
    output reg key_p_flag,
    output reg key_n_flag
    );
    parameter DELAY_TIME=1000000;
    reg key_reg;
    reg [20:0] delay_cnt;
    always @(posedge clk or negedge rst_n) begin
        if (!rst_n) begin
            key_reg <= 1'b0;
        end
        else key_reg <= key;
    end

    always @(posedge clk or negedge rst_n) begin
        if (!rst_n) begin
            delay_cnt <= 21'b0;
        end
        else if(key!=key_reg)
            delay_cnt <= DELAY_TIME;
        else if(delay_cnt>0)
        delay_cnt <= delay_cnt-1'b1;
        else 
            delay_cnt <= 21'b0;
    end

    always @(posedge clk or negedge rst_n) begin
        if(!rst_n)
            key_value <= 1'b0;
        else if(delay_cnt==1'b1)
            key_value <= key;
        else 
            key_value <= key_value;
    end

    always @(posedge clk or negedge rst_n) begin
        if(!rst_n)
            key_p_flag <= 1'b0;
        else if(delay_cnt==1'b1 && key==1)
            key_p_flag <= 1'b1;
        else
            key_p_flag <= 1'b0;
    end

    always @(posedge clk or negedge rst_n) begin
        if(!rst_n)
            key_n_flag <= 1'b0;
        else if(delay_cnt==1'b1 && key==0)
            key_n_flag <= 1'b1;
        else
            key_n_flag <= 1'b0;
    end
endmodule
